約 5,087,556 件
https://w.atwiki.jp/naoya-card/pages/20.html
2015年5月に発売されたブースターパック。 収録テーマは【シャドウファーレンズ】、【無頼武】、【ウォークォーツ】、【ネオシャーマン】、【幻蝶】、【除霊】、【直也龍】、【バイスメア】、【裁きを下す者】、【馬好き】 予約特典→プレミアムパックvol4 ウルトラ直也 ウォークォーツ 直也ギルスパイラル シャドウファーレンズ 直也アレクサンドフレア ネオシャーマン 若頭・直也 アボロギア 無頼武神 直也-ベンケイBURN スーパー直也 ウォークォーツ 直也ギルカルクル シャドウファーレンズ 直也アレクサンド シャドウファーレンズ 直也フレイム 幻蝶の舞 鋼鉄直也龍 アイロンガルド 除霊老僧 直也 無頼武 直也-ベンケイ 緑導直也龍 ジャガルダアト ノーマル直也 ウォークォーツ 直也ギルフォシーユ クォーツ・バックウェーブ シャーマンの角笛 シャドウコア シャドウファーレンズ 直也アケイズ シャドウファーレンズ 直也サプライン シャドウファーレンズ 直也ヘルヴィルヴ ターン・クォーツ・リターン トーテムコール ナオヤズ・スプラッシュ ナオヤズ・フレイムチェーン ネオシャーマン 槍士・直也アボリアノ バイスナイト トイBOX ブリリアント・ジュエル ブレイブアーマー B-Guard ミスティック・シード レアトーテム 闇の誘い 艶幻蝶 直也アゲハ 黄金の羽 火花散る鍛冶場 華幻蝶 直也アサギマダラ 光の導き 裁きの直也法典 裁きを下す者 直也コーディナ 除霊宝具 黄金木魚 侵食する影 直也印の馬好きにんじん 直也山除霊寺 馬好きトレーナー 熱血調教師 直也 宝幻蝶 直也ウスバシロ 無頼武 直也-コテツ
https://w.atwiki.jp/marikura/pages/93.html
第3回風船王決定戦 (サンプル) 名前 成績 前半 後半 かみよ 45 23 22 エルモアさん 42 21 21 こオニさん 41 20 21 リーさん 38 17 21 Fuさん 34 18 16 ゆうさん 34 15 19 パーナさん 33 15 18 偽みさ 32 18 14 ともちゃん 29 12 17 すこーるさん 26 11 15 だいくん 22 9 13 みさきち 4 3 1
https://w.atwiki.jp/flex_framework/pages/23.html
さて、ここではCairngormのもっとも重要な部分である Controller層について解説していきます。 Cairngormでは 「ScriptタグはMXMLの中にはできるだけ書かないようにしよう」 という考え方のもとに作られているのですが、 もうひとつの特徴が 「発生するイベントを一元管理しよう」 というものがあげられます。 このイベントの一元管理を実現しているのが Controller層なのです。 Controller層は大きく分けて3つになります。 1)SamplecairngormControllerというクラス 2)Commandパッケージ 3)Eventパッケージ 1) SamplecairngormControllerというクラスはイベントを一元管理するためのクラスです。 サンプルのソースを解説していきましょう。 package sample.controller.samplecairngorm { import com.adobe.cairngorm.control.FrontController; ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・① import sample.controller.samplecairngorm.command.*; ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・② /** * イベントマッピングを行うコントローラークラスです。 * このクラスでイベントを一元管理しています。 */ public class SamplecairngormController extends FrontController ・・・・・・・・・・・・・・・・③ { /** イベントを一意に識別するためのイベント名称をここで設定します */ public static const SAMPLECAIRNGORM_BTNHELLOWORLD_CLICK_EVENT String = "clickBtnHelloWorldEvent"; ・・・④ /** * コンストラクタです。 */ public function SamplecairngormController() void { super(); // addCommandメソッドで一意に指定したイベント識別名とCommandクラスとのマッピングを行います。 // これによりこの識別イベント名のイベントが発生するとCommandクラスが呼び出されるようになります。 addCommand(SAMPLECAIRNGORM_BTNHELLOWORLD_CLICK_EVENT,ClickBtnHelloWorldCommand); ・・・・・⑤ } } } ①import com.adobe.cairngorm.control.FrontController Cairngormでイベントを一元管理するために必要なFrontControllerクラスをインポートしています。 後で記述していますが、このFrontControllerクラスを継承することで、 イベントを一元管理してくれる役割をもったクラスになるわけです。 ②Commandパッケージのインポート Commandパッケージに所属するCommandクラスをインポートしています。 2)のパッケージですね。 Commandというのはイベントと1対1になるもので、 イベントが発生した際に、実行されるロジックが実装されたクラスを指しています。 クラスの内容は2)で解説します。 ③FrontControllerを継承したクラスの宣言 ①で出てきたFrontControllerクラスを継承したクラスの宣言です。 既に記したようにイベントを一元管理するために必要なクラスを継承しているという宣言です。 ④public static const SAMPLECAIRNGORM_BTNHELLOWORLD_CLICK_EVENTの宣言 Eventクラスを作成したときに使う「イベント名」をここで設定しています。 この「イベント名」がMXMLより送出されれる「イベント名」になります。 ですので、ここで宣言したイベント名がFrontControllerの中で管理されるようになります。 ⑤addCommand()メソッド ④で宣言したイベント名とCommandパッケージの中のCommandクラスの名前を引数として 実行されるメソッドです。 このaddCommandメソッドこそがCairngormでイベントと実行ロジック実装クラスとをマッピングするメソッドなのです。 このメソッドでイベントとCommandクラス名を設定しなければ、 イベントが起こってもイベントに対応した実行ロジックを呼び出すことができません。 このメソッドはCairngormの中でもっとも重要なメソッドのひとつでしょう。 2) Commandパッケージは前述にある実行ロジックの実装クラスのパッケージです。 ここでは実際にサンプルアプリケーションのCommandクラスを見てみましょう。 package sample.controller.samplecairngorm.command { import com.adobe.cairngorm.commands.ICommand; ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・① import com.adobe.cairngorm.control.CairngormEvent; ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・② import mx.rpc.IResponder; ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・③ import sample.controller.samplecairngorm.event.ClickBtnHelloWorldEvent; ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・④ import sample.datamodel.ApplicationDataModel; ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・⑤ import sample.service.samplecairngorm.SamplecairngormHttpDelegate; ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・⑥ /** * イベントを実際に実行するコマンドクラスです */ public class ClickBtnHelloWorldCommand implements ICommand,IResponder ・・・・・・・・・・・・・・・・・・・・・・・・・⑦ { /** * イベント発生後、最初に実行されるメソッドです。 * @param event CairngormEvent */ public function execute(event CairngormEvent) void ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・⑧ { // イベントはCairngormイベントの形でわたってきますので、 // それを専用のイベントにキャストします。 var e ClickBtnHelloWorldEvent = event as ClickBtnHelloWorldEvent; ・・・・・・・・・・・・・・・・・・・・・・・⑨ // Delegateクラスをインスタンス化する際に自分のインスタンスを渡します。 // これは「IResponder」インターフェースを実装したクラスが自分だからです。 var httpDelegate SamplecairngormHttpDelegate = new SamplecairngormHttpDelegate(this); ・・・⑩ // Delegateをインスタンス化する際に自分のインスタンスを渡していますが、 // このことにより、下記、メソッドが実行され、HTTPServiceあるいはRemoteObjectでの // サーバー連携の結果が自分のインスタンスの「result」あるいは「fault」メソッドに // 帰ってくるようになります。 httpDelegate.clickBtnHelloWorld(new Object()); ・・・・・・・・・・・・・・・・・・・・・・・・⑪ } /** * Resultイベントハンドラです。 * @param data オブジェクト */ public function result(data Object) void ・・・・・・・・・・・・・・・・・・・・・・・・⑫ { var model ApplicationDataModel = ApplicationDataModel.getInstance(); ・・・・・・・・・・・・・・⑬ model.sampleModel.txtField = data.result.docs.doc.say; ・・・・・・・・・・・・・⑭ } /** * Faultイベントハンドラです。 * @param info オブジェクト */ public function fault(info Object) void ・・・・・・・・・・・・・・・・・・・・・・⑮ { } } } ①ICommandインターフェースのインポート ICommandインターフェースはFrontControllerクラスを継承したクラス(サンプルではSamplecairngormController)で、 addCommandメソッドを実行する際に第2引数として渡していたCommandクラス名を 確定させるためのインターフェースです。 つまり、このICommandインターフェースを実装しないと、 FrontControllerを継承したクラスの中でaddCommandメソッドを呼び出した際に、認識してくれないのです。 ですので、Commandクラスを作成する際には必ずimplementsしましょう。 ②CairngormEventクラスのインポート このCommandクラスが受け取るEventをインポートしています。 CairngormでのイベントはすべてこのCairngormEventクラスを継承して作られています。 このあたりについては3)にて解説しますが、 executeメソッドの第1引数として渡されるクラスがこのCairngormEventなのです。 ③IResponderインターフェースのインポート IResponderインターフェースはHTTPServiceでのサーバサイドの呼び出し、 あるいはRemoteObjectのメソッドを使ってのサーバサイドの呼び出しの際に、 成功(result)か失敗(fault)かをハンドルするためのインターフェースです。 これもまたCommandと同様にimplementsしないと、後に出てくるDelegateのメソッドを実行した際に、 成功したか失敗したかの結果が返ってこなくなってしまいます。 ですので、Commandクラスを作成する際には必ずimplementsしましょう。 ④ClickBtnHelloWorldEventクラスのインポート executeメソッドで実際にイベントを受け取った際に、 このCommand専用のイベントにキャストするためにインポートしているクラスです。 ecxecuteメソッドが呼び出されたときに引数としてCairngormEventをもっているのですが、 多くの場合、呼び出されたCommand特有のイベントへとキャストして使います。 今回の場合は var e ClickBtnHelloWorldEvent = event as ClickBtnHelloWorldEvent としてCairngormEventからClickBtnHelloWorldEventへとキャストをしています。 ⑤ApplicationDataModelクラスのインポート ApplicationDataModelはデータバインディングのデータの入れ物、器です。 詳しいことはDataModel層の解説で述べますが、 データの入れ物ということなので、MXMLでデータを表示する際に使うためインポートしています。 ⑥SamplecairngormHttpDelegateクラスのインポート DelegateクラスはHTTPServiceあるいはRemoteObjectと直接連携するために 設けられたクラスです。 これはService層で解説しますが、このサンプルではHTTPServicecと連携したいために、 その連携方法をもつDelegateであるSamplecairngormHttpDelegateをインポートしています。 ⑦public class ClickBtnHelloWorldCommand implements ICommand,IResponder 前述のICommand、IResponderを実装したクラスの宣言です。 ⑧executeメソッド イベントが送出された際に呼び出される実行メソッドです。 FrontControllerを継承したクラスの中でaddCommandメソッドを用いて、 イベントとCommandクラスをマッピングしていますが、 このイベントが起こった際に呼び出されるメソッドがこのメソッドです。 またイベントが起こった際にはCairngormEventが渡されてきます。 多くの場合、自分のCommandクラスに関連付けされたEventへキャストして利用します。 これは④で、既に述べられています。 ⑨ClickBtnHelloWorldEventクラスへのキャスト ④、⑧の解説ですべてです。 ⑩HTTPServiceあるいはRemoteObjectとの橋渡し役をするDelegateクラスのインスタンス化 Delegateクラスの役割は⑥の解説とService層の解説に記述されていますが、 ここでのポイントはDelegateクラスをインスタンス化するときに、 new SamplecairngormHttpDelegate(this) と、自分のインスタンスを渡しているところです。 この自分のインスタンスを渡すことで、自分の持っているメソッドであるresult、faultに HTTPServiceやRemoteObjectメソッドの実行結果が返ってくるようになります。 これはIResponderインターフェースを実装しているからです。 ⑪Delegateのメソッドの呼び出し HTTPServiceやRemoteObjectを利用しての呼び出しはすべてDelegateクラスを 用いて行うこと、というのがCairngormのひとつのルールです。 このサンプルでもそのルールに従って呼び出しています。 ⑫resultメソッド ⑬ApplicationDataModelのインスタンスの取得 ⑭結果をDataModelへ設定 ⑩にて解説されていますが、Delegateクラスのメソッドを実行したときに、 その実行が成功した場合に実行されるメソッドです。 サーバサイドと連携した場合、このメソッドにデータベースの検索結果等が 返ってきますので、それを用いてロジックを実装していくところです。 多くの場合、データベースの検索結果などは ApplicationDataModelのインスタンスを取得して、 そのDataModelのプロパティに該当する結果を設定する、といった形になります。 ⑮faultメソッド ⑩にて解説されていますが、Delegateクラスのメソッドを実行したときに、 その実行が失敗した場合に実行されるメソッドです。 HTTP接続エラーなどのエラーハンドリングは、このメソッドで記述していくことが多いのではないでしょうか。 3) EventパッケージはFrontControllerクラスを継承したクラスを作る際に public static const SAMPLECAIRNGORM_BTNHELLOWORLD_CLICK_EVENT のように静的領域に文字列を宣言していましたよね。 その文字列を使って作ったものがEventパッケージの中に入ります。 ここでは実際にサンプルアプリケーションのEventクラスを見てみましょう。 package sample.controller.samplecairngorm.event { import com.adobe.cairngorm.control.CairngormEvent; ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・① import sample.controller.samplecairngorm.* ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・② /** * イベントクラスです */ public class ClickBtnHelloWorldEvent extends CairngormEvent ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・③ { /** * コンストラクタです */ public function ClickBtnHelloWorldEvent(o Object) void ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・④ { // コントローラーに設定した一意に識別するためのイベント名を // superクラスのコンストラクタに渡しています。 // これにより、このイベントはコントローラーに設定した一意の識別名をもつ // イベントとして認識されるようになります。 super(SamplecairngormController.SAMPLECAIRNGORM_BTNHELLOWORLD_CLICK_EVENT); ・・・・・・⑤ } } } ①import com.adobe.cairngorm.control.CairngormEvent Eventクラスを作る際には、Cairngormでは必ず、このCairngormEventクラスを継承します。 その継承のためにインポートをしています。 ② import sample.controller.samplecairngorm.* 後で記述が出てきますが、FrontControllerクラスを継承したクラスの中で 「public static const」と宣言した文字列があると思います。 その文字列を利用するため、Controllerクラスをインポートしています。 ③public class ClickBtnHelloWorldEvent extends CairngormEvent CairngormEventを継承してEventクラスを宣言しています。 ④ ClickBtnHelloWorldEventコンストラクタ ⑤super(SamplecairngormController.SAMPLECAIRNGORM_BTNHELLOWORLD_CLICK_EVENT) このコンストラクタの中で宣言されている親クラスのコンストラクタを呼び出すsuper()メソッドの中で、 ②にてインポートしたFrontControllerクラスを継承したクラスの 「public static const」で宣言した文字列を利用して親のコンストラクタを呼び出しています。 この親のコンストラクタに渡される文字列が、Cairngormの中で一元管理されるようになります。 以上、少し長くなりましたがController層の解説になります。 次はDataModel層です。
https://w.atwiki.jp/nico_player/pages/66.html
このページは何? 実用サンプルの導入方法 実用サンプルコメントを投稿する コメント このページは何? 動画情報ウィンドウの機能拡張により様々な機能を追加した実用的なサンプルを投稿するページです。 機能拡張サンプルは動画情報ウィンドウで実現できることが必要最小限のコードでTipsとして投稿されており、自分で動画情報ウィンドウに組み込むためにはある程度の知識が必要になります。 このページでは実用的なサンプルをファイルとして配布することで誰でも簡単に動画情報ウィンドウを拡張出来るようするためのページです。 実用サンプルの導入方法 以下通常の手順を箇条書きします。 導入したいファイルをダウンロードする ダウンロードしたファイルを解凍する 解凍して出てきたファイルをNicoPlayer.exeと同じ場所にあるvideoinfoフォルダに移動させる(ファイルを上書きする) 以上で導入は完了です。圧縮ファイルの中にreadme.txtなど別途説明のファイルが存在する場合はその手順に従って導入して下さい。 実用サンプル コメントを投稿する post_comment.zip ※Ver.0.90以降NicoPlayerに初期状態でコメント投稿機能が追加されました コメント ?? -- 名無しさん (2010-07-11 18 45 11) AaKhmntbhVRy -- grzhmvnujio (2010-12-14 17 12 41) 名前 コメント
https://w.atwiki.jp/minecraft_icbcrp/pages/58.html
親ページに戻る ├チュートリアル └サンプルプログラム サンプルプログラムについて サンプルプログラムパスワードドア NOT回路 ランダムパルス回路 ワイヤレスレッドストーンスイッチ 鉄道建設プログラム Turtle遠隔操作プログラム サンプルプログラムについて 赤文字は実際に利用する際には変更しなければならない部分です、このままでは動作しません。 サンプルプログラム パスワードドア 正しいパスワードを入力するとN秒間レッドストーン動力を出力するプログラムです。 passwordに正しいパスワード、NにRS動力を出力する時間、OutputにRS動力を出力する面を入れて下さい。 write()内の\nは改行を意味します。 pass = ("password") write("Enter password.\n") a = read() if a == pass then write("Password correct!\n") rs.setOutput("Output", true) sleep(N) rs.setOutput("Output", false) else write("Password incorrect!\n") end NOT回路 Inputから入力を受けている時は何も出力せず、入力を受けてない時はOutputから出力するプログラムです。 プログラムを終了させる時はctrl+Tを利用して下さい。 if rs.getInput("Input") == false then rs.setOutput("Output", true) end while true do os.pullEvent("redstone") if rs.getInput("Input") == true then rs.setOutput("Output", false) else rs.setOutput("Output", true) end end ランダムパルス回路 ランダムな間隔で0.2秒のパルスをOutputから出力するプログラムです。 while true do a = math.random(1, 10) if a = 5 then rs.setOutput("Output", true) sleep(0.2) rs.setOutput("Output", false) sleep(0.2) else sleep(0.4) end end ワイヤレスレッドストーンスイッチ 送信側でプログラムを起動する度に受信側でレッドストーンのON/OFFが切り替わるプログラムです。 modemにはモデムを設置している面、idには受信側のコンピューターID又はラベル、OutputにはRS動力を出力する面を入れて下さい。 送信側プログラム rednet.open("modem") rednet.send(id, "") 受信側プログラム rednet.open("modem") while true do os.pullEvent("rednet_message") rs.setOutput("Output", true) os.pullEvent("rednet_message") rs.setOutput("Output", false) end 鉄道建設プログラム マイニングタートル専用の自動レール敷設プログラムです。 プログラムを起動して、数字を入力するとそのブロック数レールを敷設します。 障害となるブロックは全て採掘し、足場が無ければ設置します。 タートルのインベントリの1番目に足場となるブロック、2番目にレールを入れて下さい。 なおスタックの都合上このプログラムでは65ブロック以上の敷設はできません。 またMOBにぶつかったりした場合正常に動作しない恐れがあります。 function reversedirection() turtle.turnRight() turtle.turnRight() end function dig(n) turtle.up() for i=1,n do while turtle.detect() == true do turtle.dig() sleep(0.5) end turtle.forward() turtle.digDown() end turtle.down() end function construction(n) for i=1,n do if turtle.detectDown() == false then turtle.select(1) turtle.placeDown() turtle.up() else turtle.up() end turtle.select(2) turtle.placeDown() turtle.forward() turtle.down() end end a = read() dig(a) reversedirection() construction(a) reversedirection() Turtle遠隔操作プログラム WirelessTurtleを遠隔操作するプログラムです。 送信側のインターフェースを開いておく必要がある為実用性は疑問ですが、 rednetAPIを用いたプログラムの参考にして頂ければと思います。 modemにはモデムの設置面、idには受信側Turtleのid又はラベルを入れて下さい。 送信側プログラム function keyconvert(k) if k == 17 then return "Forward" elseif k == 31 then return "Back" elseif k == 30 then return "TurnLeft" elseif k == 32 then return "TurnRight" elseif k == 42 then return "Down" elseif k == 57 then return "Up" elseif k == 18 then return "Exit" else return "This key is not assigned." end end print("w = Forward\ns = Back\na = TurnLeft\nd = TurnRight\nshift = Down\nspace = Up\ne = Exit") rednet.open("modem") while true do a, b = os.pullEvent("key") c = keyconvert(b) if c == "This key is not assigned." then print(c) else rednet.send(id, c) print(c) if c == "Exit" then break end end end 受信側プログラム rednet.open("right") while true do a, b = rednet.receive() if b == "Exit" then break end if b == "Forward" then turtle.forward() elseif b == "Back" then turtle.back() elseif b == "TurnLeft" then turtle.turnLeft() elseif b == "TurnRight" then turtle.turnRight() elseif b == "Down" then turtle.down() elseif b == "Up" then turtle.up() end end
https://w.atwiki.jp/chaos-tcg/pages/710.html
ゲパルトM1アンチ・マテリアル・ライフル 読み:げぱるとM1あんち・まてりある・らいふる カテゴリー:Set 作品:Phantom INTEGRATION [永続]このキャラをアタックキャラやガードキャラに選ぶことができない。 Main 〔【スタンド】から【リバース】にし、自分の手札1枚を控え室に置く〕目標のキャラ1体に、このキャラの攻撃力分のダメージを与える。この能力は1ターンに1回だけ発動できる。 illust:Nitroplus NP-077 U 収録:ブースターパック 「OS:ニトロプラス1.10」 セットしたキャラの攻撃力分のダメージを与える能力を持つセットカード。 アタックとガードができなくなるが、能力を使用すればどちらも不可能な状態になるので特に問題はない。 また、元々アタックやガードができないキャラや、バトルに弱いキャラにセットしても良いだろう。 2010年2月12日付けで、2月20日適用のエラッタがかかった。 エラッタ前のテキストは以下の通り。 Main 〔【スタンド】から【リバース】にする〕目標のキャラ1体に、このキャラの攻撃力分のダメージを与える。 手札コストを必要とせず1ターンの回数制限もなかった。 エクストラキャラの登場、レベルアップと組み合わせることで何度も発動できたのが危険視されたのだろう。
https://w.atwiki.jp/mieki256/pages/31.html
#!/usr/bin/env python # -*- coding utf-8 -*- u""" PyGame + OpenGLのテストサンプル - Pキー 平行投影/透視投影の切り替え - Wキー ワイヤーフレーム/ソリッド表示の切り替え - Lキー 照明のon/off - Tキー テクスチャ設定の切り替え(3種類) - Sキー ポイントスプライトの切り替え - Fキー ウインドウ/フルスクリーン切り替え - カーソルキー ティーポットの回転 - Bキー Pause - ESCキー,Qキー 終了 - マウスカーソルの位置に合わせて図形の表示位置を変える。 参考ページ pygameに移行 — メモ庫 v1.0 documentation http //gunload.web.fc2.com/opengl/tutorial/skinning/pygame/ PyOpenGL + PIL でテクスチャ貼り - 銀月の符号 http //d.hatena.ne.jp/fgshun/20080922/1222095288 Wiki - pygame - python game development http //www.pygame.org/wiki/SimpleOpenGL2dClasses """ import pygame from OpenGL.GL import * from OpenGL.GLU import * from OpenGL.GLUT import * from OpenGL.extensions import alternate from OpenGL.GL.ARB.point_parameters import * from OpenGL.GL.EXT.point_parameters import * import Image import math # 照明 light_ambient = [1.0, 1.0, 1.0, 1.0] # 環境光(白色) light_diffuse = [1.0, 1.0, 1.0, 1.0] # 拡散光(白色) light_specular = [1.0, 1.0, 1.0, 1.0] # 鏡面光(白色) light_position = [2.0, 2.0, 1.0, 1.0] # 照明の位置 # マテリアル no_mat = [0.0, 0.0, 0.0, 1.0] # 反射しない mat_ambient = [0.0, 0.0, 0.3, 1.0] # 環境光の青成分だけ少し反射 mat_diffuse = [0.0, 1.0, 0.0, 1.0] # 拡散光の緑成分を全反射 mat_specular = [1.0, 1.0, 1.0, 1.0] # 鏡面光の全成分を全反射 mat_emission = [0.3, 0.3, 0.2, 0.0] # 放射の色 no_shininess = [0.0] # 鏡面反射しない low_shininess = [5.0] # 弱い鏡面反射 high_shininess = [100.0] # 強い鏡面反射 glPointParameterf = alternate( glPointParameterf, glPointParameterfARB, glPointParameterfEXT ) glPointParameterfv = alternate( glPointParameterfv, glPointParameterfvARB, glPointParameterfEXT ) RESET_ATTENUATION = [1.0, 1.0, 1.0] class PyGame def __init__(self) """コンストラクタ""" self._running = True self._screen = None self.frame = 0 # フレームカウンタ self.mx = 0 self.my = 0 self.tex = [] self.cap = "" self.pausefg = False # キー操作で変更するフラグ群 self.flag2d = True # 平行/透視投影 self.wireframe = False # ワイヤーフレーム/ソリッド表示 self.light_enable = True # 照明 on/off self.tex_mode = 0 # テクスチャモード self.point_spr = False # ポイントスプライト on/ff self.fullscr = False # フルスクリーン/ウインドウ表示 self.filter_type = 0 # テクスチャのフィルタ種類(0 or 1) self.tex_repeat = False # テクスチャをリピートさせるか否か self.line_width = 1.0 # ワイヤーフレーム表示時の線の太さ # 画面の縦横幅記録用 self.view_wh = 1.0 self.view_hh = 1.0 # テクスチャ付きポリゴンの色指定用 self.texcol = 0.0 self.texcol_spd = 0.01 self.angle = 0.0 # 回転角度 self.scale = 0.0 # 拡大縮小 self.xrot = 0.0 # 回転角度 self.yrot = 0.0 self.xspeed = 0.0 # 回転速度 self.yspeed = 0.0 self.mvfrm = 0 # eventの分岐をディクショナリに変更 self._eventMap = { pygame.QUIT self.onQuit, pygame.MOUSEBUTTONDOWN self.onMouseDown, pygame.MOUSEBUTTONUP self.onMouseUp, pygame.MOUSEMOTION self.onMouseMotion, pygame.KEYDOWN self.onKeyDown, pygame.KEYUP self.onKeyUp, } def initialize(self, w, h) """初期化処理""" pygame.init() # PyGame初期化 self.scrw = float(w) self.scrh = float(h) return self.init_gl() def init_gl(self) """OpenGL関係の初期化""" w = int(self.scrw) h = int(self.scrh) # OPENGL向けに初期化する modev = pygame.OPENGL | pygame.DOUBLEBUF if self.fullscr modev |= pygame.FULLSCREEN self._screen = pygame.display.set_mode((w, h), modev) if not self._screen return False glViewport(0, 0, int(self.scrw), int(self.scrh)) glClearColor(0.0, 0.0, 0.5, 1.0) # クリア色の設定 # 隠面消去、カリングを設定 glEnable(GL_DEPTH_TEST) glEnable(GL_CULL_FACE) glCullFace(GL_BACK) # 裏面をカリング # 照明の設定 glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient) glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse) glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular) glLightfv(GL_LIGHT0, GL_POSITION, light_position) glEnable(GL_LIGHTING) # 照明を有効化 glEnable(GL_LIGHT0) # 0番目の照明を有効化 # テクスチャの読み込み glEnable(GL_TEXTURE_2D) # テクスチャ有効化 t = self.loadImage( res/tex1.png ) self.tex.append(t[0]) t = self.loadImage( res/tex2.png ) self.tex.append(t[0]) t = self.loadImage( res/tex4.png ) self.tex.append(t[0]) # ウインドウ内の座標値を計算して記録 # (-w ~ 0.0 ~ +w, +h ~ 0.0 ~ -h) s = 8.0 self.view_wh = s * (self.scrw / self.scrh) self.view_hh = s if self.flag2d self.set_view2d() else self.set_view3d() return True def loadImage(self, image_fila_path) """テクスチャ画像をロード""" # PyGameを使って画像ロード textureSurface = pygame.image.load(image_fila_path) # 画像読み込み width = textureSurface.get_width() # 横幅取得 height = textureSurface.get_height() # 縦幅取得 # OpenGLに渡すために文字列化 textureData = pygame.image.tostring(textureSurface, "RGBA", False) texture = glGenTextures(1) # テクスチャを1枚生成 glBindTexture(GL_TEXTURE_2D, texture) # テクスチャとして登録 # _S は横方向、_T は縦方向 # テクスチャをリピートさせるかしないか if self.tex_repeat glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT) else glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP) # _MAG_FILTER は拡大時のフィルタ種類, _MIN_ は縮小? if self.filter_type == 0 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST) else glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) # glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL) # glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE) glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE) # ポイントスプライトにも使えるように設定 glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE) # テクスチャを設定 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureData) # アルファテストの判別関数 # コレを入れないとポイントスプライトを透過できない glAlphaFunc(GL_GREATER, 0.5) return texture, width, height def set_view2d(self) """2D描画用に設定""" # 座標系の設定 glMatrixMode(GL_PROJECTION) # 射影変換 glLoadIdentity() # 単位行列 # 以後、平行投影で描画するよう指定 glOrtho(-self.view_wh, self.view_wh, - self.view_hh, self.view_hh, 0.1, 100.0) # 以下のように書けば、2Dっぽい座標系になる # gluOrtho2D(0, 640, 480, 0) def set_view3d(self) """3D描画用に設定""" glMatrixMode(GL_PROJECTION) glLoadIdentity() # 以後、透視投影で描画するよう指定 gluPerspective(60.0, self.scrw / self.scrh, 0.1, 100.0) def set_tex_mode(self) """テクスチャモードの切り替え""" md = [ GL_REPLACE, GL_MODULATE, GL_DECAL ] glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, md[self.tex_mode]) def update(self) """毎フレーム呼ばれる処理""" if not self.pausefg # マウス座標を表示系の座標値に変換して記録 wh = self.scrw / 2.0 hh = self.scrh / 2.0 self.tx = (self.mx - wh) / wh self.ty = (self.scrh - self.my - hh) / hh self.tx *= self.view_wh self.ty *= self.view_hh self.angle += 1.5 # 角度を更新 self.scale = 2.0 * math.cos(math.radians(self.mvfrm)) + 2.5 self.xrot += self.xspeed self.yrot += self.yspeed # オブジェクトの色指定用変数を変更 self.texcol += self.texcol_spd if self.texcol = 1.0 or self.texcol = 0.0 self.texcol_spd *= -1 self.mvfrm += 1 def draw(self) """描画処理""" # OpenGLバッファのクリア glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) # 視野変換:カメラの位置と方向のセット # gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0) # glShadeModel(GL_FLAT) # フラットシェーディングを有効化 glShadeModel(GL_SMOOTH) # スムースシェーディングを有効化 glEnable(GL_NORMALIZE) # 法線の自動正規化を有効化 # 平行投影/透視投影を設定 if self.flag2d self.set_view2d() else self.set_view3d() # 照明の有効/無効化 if self.light_enable glEnable(GL_LIGHTING) else glDisable(GL_LIGHTING) glMatrixMode(GL_MODELVIEW) glLoadIdentity() self.draw_teapot() # ティーポットを描画 self.draw_ball() # 球を描画 self.draw_cube() # 箱を描画 glDisable(GL_LIGHTING) # 照明無効化 self.draw_point(-self.angle / 4.0, self.view_hh * 0.5) # 点を描画 x = self.tx y = self.ty w = self.view_wh h = self.view_hh # テクスチャ付きポリゴンを描画(テクスチャ1) tx = 0.0 ty = 0.0 tz = -60.0 texid = 0 self.draw_polygon_tex(tx, ty, tz, 1.0, 1.0, h, h, texid) # テクスチャ付きポリゴンを描画(テクスチャ2) tx = self.view_wh / 3 tz = -40.0 texid = 1 self.draw_polygon_tex(tx, ty, tz, 1.0, 1.0, h, h, texid) self.set_view2d() # 平行投影にするよう設定 glDisable(GL_DEPTH_TEST) # 隠面消去を無効 glDisable(GL_CULL_FACE) # カリング無効化 glClear(GL_DEPTH_BUFFER_BIT) # デプスバッファクリア glMatrixMode(GL_MODELVIEW) glLoadIdentity() self.draw_box(x, y, w, h) # 赤いグラデの四角形を描画 self.draw_tri(x, y, w, h) # 緑のグラデの三角形を描画 self.draw_line(x, y, w, h) # 線を描画 # テキストを描画 self.draw_info() # バッファ切り替え (ダブルバッファ時) # glutSwapBuffers() # OpenGL描画実行 (シングルバッファ時?) # glFlush() # pygameダブルバッファ交換 pygame.display.flip() def draw_text(self, x, y, st) """文字列をビットマップフォントで描画""" glColor3f(1.0, 1.0, 1.0) glRasterPos3f(x, y, -3.0) for s in st glutBitmapCharacter(GLUT_BITMAP_HELVETICA_10, ord(s)) def draw_info(self) """現在の状態をテキスト描画する""" lyadd = -(self.view_hh / 12.0) lx = -(self.view_wh * 0.95) ly = self.view_hh + lyadd strlist = [] strlist.append(self.cap) strlist.append("P " + ("Pers" if not self.flag2d else "Ortho")) strlist.append("W " + ("Wireframe" if self.wireframe else "Solid")) strlist.append("L Light " + ("On" if self.light_enable else "Off")) strlist.append("T " + (["GL_REPLACE", "GL_MODULATE", "GL_DECAL"][self.tex_mode])) strlist.append("S PointSprite " + ("On" if self.point_spr else "Off")) strlist.append("F " + ("Full" if self.fullscr else "Wdw")) strlist.append("B Pause") strlist.append("ESC,Q EXIT") for s in strlist self.draw_text(lx, ly, s) ly += lyadd def draw_polygon_tex(self, x, y, z, tx, ty, vx, vy, texid) """テクスチャ付きポリゴンを描画""" col = self.texcol glFrontFace(GL_CCW) # 頂点反時計回りを表として扱う # 頂点配列を作成 vertices = [-1.0, -1.0, 0.0, # 左下 1.0, -1.0, 0.0, # 右下 1.0, 1.0, -25.0, # 右上 - 1.0, 1.0, -25.0 # 左上 ] # テクスチャ座標配列を作成 texcoords = [0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0 ] # カラー配列を作成 colors = [col, col, 0.5, 1.0, col, col, 0.5, 1.0, col, col, 0.0, 1.0, col, col, 0.0, 1.0 ] # 使うテクスチャを選択 glBindTexture(GL_TEXTURE_2D, self.tex[texid]) # テクスチャを透過にする glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glLoadIdentity() glTranslatef(x, y, z) # 平行移動 glRotatef(self.angle / 2.0, 0.0, 0.0, 1.0) # 回転 glScale(vx, vy, 1.0) # 拡大縮小 # 頂点配列、テクスチャ座標配列、カラー配列有効化 glEnableClientState(GL_VERTEX_ARRAY) glEnableClientState(GL_TEXTURE_COORD_ARRAY) glEnableClientState(GL_COLOR_ARRAY) # 頂点配列、テクスチャ座標配列、カラー配列を指定 glVertexPointer(3, GL_FLOAT, 0, vertices) glTexCoordPointer(2, GL_FLOAT, 0, texcoords) glColorPointer(4, GL_FLOAT, 0, colors) glEnable(GL_TEXTURE_2D) # テクスチャを有効に # ポリゴンとして描画 glDrawElements(GL_QUADS, 4, GL_UNSIGNED_BYTE, [0, 1, 2, 3]) # glDrawArrays(GL_POLYGON, 0, 4) glDisable(GL_TEXTURE_2D) # テクスチャを無効に # 頂点配列、テクスチャ座標配列、カラー配列無効化 glDisableClientState(GL_VERTEX_ARRAY) glDisableClientState(GL_TEXTURE_COORD_ARRAY) glDisableClientState(GL_COLOR_ARRAY) def draw_box(self, x, y, w, h) """赤いグラデの四角形を描く""" glFrontFace(GL_CCW) # 頂点反時計回りを表とする h /= 10.0 w = h z = -40.0 glLoadIdentity() glBegin(GL_QUADS) # 描画開始 glColor3f(0.5, 0.0, 0.0) # 色を指定 glVertex3f(x - w, y - h, z) # 左下 glColor3f(0.5, 0.0, 0.0) glVertex3f(x + w, y - h, z) # 右下 glColor3f(1.0, 0.0, 0.0) glVertex3f(x + w, y + h, z) # 右上 glColor3f(1.0, 0.0, 0.0) glVertex3f(x - w, y + h, z) # 左上 glEnd() # 描画終了 def draw_tri(self, x, y, w, h) """緑のグラデの三角形を描く""" glFrontFace(GL_CCW) # 頂点反時計回りを表とする z = -50.0 glBegin(GL_TRIANGLES) # 三角形描画開始 glColor4f(0.0, 1.0, 0.0, 1.0) # 色を指定 glVertex3f(-w, -h, z) # 左下 glVertex3f(w, -h, z) # 右下 glColor4f(0.0, 0.2, 0.0, 0.2) glVertex3f(x, y, z) # 上 glEnd() def draw_line(self, x, y, w, h) """線を描く""" z = -5.0 glColor3f(0.0, 1.0, 1.0) # 水色 glLineWidth(self.line_width) # 線のサイズ glBegin(GL_LINES) glVertex3f(-w, y, z) # 始点 glVertex3f(w, y, z) # 終点 glVertex3f(x, h, z) # 始点 glVertex3f(x, -h, z) # 終点 glEnd() def draw_point(self, startang, r) """点を描く""" glLoadIdentity() z_d = 10 zadd = (float(self.mvfrm) / 5.0) % float(z_d) # アルファブレンディングを有効化 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) glEnable(GL_BLEND) if self.point_spr # ポイントスプライト有効時 glEnable(GL_POINT_SPRITE) # ポイントスプライトを有効化 glDisable(GL_POINT_SMOOTH) # 点のAAを無効化 glEnable(GL_TEXTURE_2D) # テクスチャを有効化 # テクスチャに色指定を反映させるよう指定 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE) # 使うテクスチャを選択 glBindTexture(GL_TEXTURE_2D, self.tex[2]) glEnable(GL_ALPHA_TEST) # アルファテストを有効化 glPointSize(64.0) # 点のサイズを指定 # 距離に応じて点の大きさを変える glPointParameterfv(GL_POINT_DISTANCE_ATTENUATION, [0.0, 0.0, 0.02]) glBegin(GL_POINTS) # 点の描画開始を指定 lang = math.radians(startang) langadd = math.radians(20) for z in range(-40, -5, z_d) # 奥行を変えて描画 zz = z + zadd v = (30.0 + zz + 10.0) / 30.0 if v 1.0 v = 1.0 for i in range(0, 360, 20) # 円を描くように描画 x = r * math.cos(lang) y = r * math.sin(lang) glColor3f(v, v, 0.5) # 色を指定 glVertex3f(x, y, zz) # 点座標を指定 lang += langadd glEnd() # 距離に応じて点のサイズを変えるソレに初期値を入れてリセット glPointParameterfv(GL_POINT_DISTANCE_ATTENUATION, [1.0, 0.0, 0.0]) glDisable(GL_ALPHA_TEST) # アルファテストを無効化 glDisable(GL_POINT_SPRITE) # ポイントスプライトを無効化 self.set_tex_mode() else # ポイントスプライト無効時 glDisable(GL_TEXTURE_2D) # テクスチャを無効化 glDisable(GL_POINT_SPRITE) # point_sprite を無効化 glEnable(GL_POINT_SMOOTH) # 点のAAを有効化 glHint(GL_POINT_SMOOTH_HINT, GL_NICEST) # AAの品質を参考に glPointSize(3.0) # 点のサイズ # 距離に応じて点の大きさを変えない glPointParameterfv(GL_POINT_DISTANCE_ATTENUATION, [1.0, 0.0, 0.0]) glBegin(GL_POINTS) lang = math.radians(startang) langadd = math.radians(10) for z in range(-40, -5, z_d) # 奥行を変えて描画 zz = z + zadd v = (30.0 + zz + 10.0) / 30.0 if v 1.0 v = 1.0 for i in range(0, 360, 10) # 円を描くように描画 x = r * math.cos(lang) y = r * math.sin(lang) glColor3f(v, v, 0.5) # 色を指定 glVertex3f(x, y, zz) # 点座標を指定 lang += langadd glEnd() glDisable(GL_TEXTURE_2D) # テクスチャを無効化 def set_material(self, kind) """マテリアルを設定""" matdata = [ [mat_ambient, mat_diffuse, no_mat, no_shininess, no_mat], [no_mat, mat_diffuse, mat_specular, low_shininess, no_mat], [no_mat, mat_diffuse, mat_specular, high_shininess, no_mat], [no_mat, mat_diffuse, no_mat, no_shininess, mat_emission] ] dt = matdata[kind] glMaterialfv(GL_FRONT, GL_AMBIENT, dt[0]) glMaterialfv(GL_FRONT, GL_DIFFUSE, dt[1]) glMaterialfv(GL_FRONT, GL_SPECULAR, dt[2]) glMaterialfv(GL_FRONT, GL_SHININESS, dt[3]) glMaterialfv(GL_FRONT, GL_EMISSION, dt[4]) def draw_teapot(self) """ティーポットを描く""" glFrontFace(GL_CW) # teapotは頂点時計回りが表。他と逆なので注意。 glEnable(GL_DEPTH_TEST) # 隠面消去を有効化 glDisable(GL_CULL_FACE) # カリング無効化 # teapotだけはテクスチャを反映できるので、テクスチャを無効にしておく。 # cubeやsphere等はテクスチャを反映できない。 glDisable(GL_TEXTURE_2D) self.set_material(1) # マテリアルの設定 # 平行移動、回転、拡大縮小は、 # 下に書いてある変換のほうから先に実行される glLoadIdentity() glTranslatef(-6.0, 0.0, -10.0) # 平行移動 glRotatef(self.xrot, 1.0, 0.0, 0.0) # x軸に沿って回転 glRotatef(self.yrot, 0.0, 1.0, 0.0) # y軸に沿って回転 glScale(1.0, 1.0, 1.0) # 拡大縮小 glColor3f(1.0, 0.0, 0.0) # 色を赤に(照明利用時は無視される) if self.wireframe # ワイヤーフレームで描画 glLineWidth(self.line_width) # 線のサイズ glutWireTeapot(2.0) else # ソリッドで描画 glutSolidTeapot(2.0) def draw_cube(self) """立方体を描画""" glFrontFace(GL_CCW) # cubeは頂点反時計回りが表扱い glEnable(GL_CULL_FACE) # カリング有効化 glCullFace(GL_BACK) # 裏面をカリングするように指定 self.set_material(0) # マテリアルの設定 glLoadIdentity() glTranslatef(0.0, 0.0, -15.0) glRotatef(self.angle, 0.0, 1.0, 1.0) # y軸、z軸に沿って回転 glScale(1.0, 1.0, self.scale / 2) glColor3f(0.0, 1.0, 0.0) # 色を緑に if self.wireframe glLineWidth(self.line_width) glutWireCube(3.0) else glutSolidCube(3.0) def draw_ball(self) """球を描画""" glFrontFace(GL_CCW) # 球は頂点反時計回りが表扱い glEnable(GL_CULL_FACE) glCullFace(GL_BACK) self.set_material(2) # マテリアルの設定 glLoadIdentity() glTranslatef(6.0, 0.0, -20.0) glRotatef(self.angle, 1.0, 0.0, 0.0) # x軸に沿って回転 glScale(1.0, self.scale, 1.0) glColor3f(1.0, 0.0, 1.0) # 色を紫に if self.wireframe glLineWidth(self.line_width) glutWireSphere(1.0, 10, 10) else glutSolidSphere(1.0, 10, 10) def on_event(self, event) """イベント発生時に呼ばれる処理""" if event.type in self._eventMap self._eventMap[event.type](event) def onQuit(self, event) """メインループを終了させるよう設定""" self._running = False def onKeyDown(self, event) """キーが押された瞬間に呼ばれる処理""" if event.key == pygame.K_ESCAPE or event.unicode == u q # ESCキーかqキーが押されたので終了 pygame.event.post(pygame.event.Event(pygame.QUIT)) elif event.key == pygame.K_UP # 上キーが押された self.xspeed -= 0.1 elif event.key == pygame.K_DOWN # 下キーが押された self.xspeed += 0.1 elif event.key == pygame.K_LEFT # 左キーが押された self.yspeed -= 0.1 elif event.key == pygame.K_RIGHT # 右キーが押された self.yspeed += 0.1 elif event.key == pygame.K_l # 照明のon/off self.light_enable = not self.light_enable elif event.key == pygame.K_p # 平行投影/透視投影の切り替え self.flag2d = not self.flag2d elif event.key == pygame.K_w # ワイヤーフレーム/ソリッド描画の切り替え self.wireframe = not self.wireframe elif event.key == pygame.K_t # テクスチャモードの切り替え self.tex_mode = (self.tex_mode + 1) % 3 md = [GL_REPLACE, GL_MODULATE, GL_DECAL] glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, md[self.tex_mode]) elif event.key == pygame.K_f # フルスクリーン/ウインドウの切り替え self.fullscr = not self.fullscr self.init_gl() elif event.key == pygame.K_s # ポイントスプライトの切り替え self.point_spr = not self.point_spr elif event.key == pygame.K_b # ポーズ self.pausefg = not self.pausefg else print("KeyDown", event.unicode, event.key, event.mod) def onKeyUp(self, event) """キーが離された瞬間に呼ばれる処理""" # print("KeyUp", event.key, event.mod) pass def onMouseDown(self, event) """マウスボタンが押された瞬間に呼ばれる処理""" lis = [ unknown , # 0 left , # 1 middle , # 2 right , # 3 wheelup , # 4 wheeldown # 5 ] if event.button = 5 print( onMouseDown , lis[event.button], event.pos) def onMouseUp(self, event) """マウスボタンが離された瞬間に呼ばれる処理""" lis = [ unknown , # 0 left , # 1 middle , # 2 right , # 3 wheelup , # 4 wheeldown # 5 ] if event.button = 5 print( onMouseUp , lis[event.button], event.pos) def onMouseMotion(self, event) """マウスカーソルが動いた時に呼ばれる処理""" # print( onMouseMotion , event.pos, event.rel, event.buttons) self.mx = event.pos[0] self.my = event.pos[1] def execute(self, w, h) if not self.initialize(w, h) return timer = pygame.time.Clock() # メインループ while self._running timer.tick(60) # 60FPSを指定 for event in pygame.event.get() self.on_event(event) self.update() self.draw() self.frame += 1 self.cap = %5.2f FPS % (timer.get_fps()) # ウインドウタイトル文字列を指定 pygame.display.set_caption(self.cap) pygame.quit() if __name__ == "__main__" game = PyGame() game.execute(800, 600)
https://w.atwiki.jp/mylists/pages/17.html
NiVEサンプル・エフェクト関係 ※とりあえずエフェクト/プラグインの紹介がメインの動画を集めるつもり。 ※最新版対応のプロジェクトファイルを 金の髭のNiVEまとめメモ さんが公開されてます。 0 10 2008年04月08日 投稿 NiVEサンプル スコープっぽいもの エフェクト:グレイン どちらかというとカメラの使い方メイン? 0 07 2008年04月10日 投稿 NiVEサンプル 複合リニアワイプ エフェクト:リニアワイプ 2つ合わせたり回転させたりできるらしい 0 07 2008年04月10日 投稿 NiVEサンプル nShine使ってみました エフェクト:nShine 背景から光が放出される感じ 0 10 2008年04月11日 投稿 NiVEサンプル カラーキー使ってみました エフェクト:カラーキー 文字をカラーキーで抜いて背景のキラキラを見せる 0 16 2008年04月12日 投稿 NiVEサンプル フラクタルノイズ エフェクト:フラクタルノイズ テキストをフラクタルノイズより下のラインにしちゃうと文字がテカらないらしい 0 10 2008年04月13日 投稿 NiVEサンプル? エフェクト:たぶんマスク(手書き) 0 10 2008年04月17日 投稿 NiVEサンプル リニアワイプ使ってみました エフェクト:リニアワイプ 実は境界線を回しながら切り替えられるという 0 17 2008年04月20日 投稿 NiVEサンプル 極座標変換 エフェクト:極座標変換 ぐにゃぐにゃする(雑すぎw 0 10 2008年05月10日 投稿 NiVEサンプル コボちゃん エフェクト:マスク(手描き) 描き方があるらしいw 1 30 2008年05月18日 投稿 NiVEプラグイン/擬似筆順(3) mdiappという描画ソフトがあり(マンガなどを書くのに使うらしい)それには「ベクターレイヤー」というモード(?)があります そのモードで書いたものをmdi形式で保存すると書いた順序などが記録されるらしく、それをNiVEから読み込んで最初から順に表示できるようです NiVEプラグイン/枠+文字吹雪+筆 → sm3260800 0 03 2008年12月17日 投稿 NiVEプラグイン/NiVE+AzDrawing (*.apd) AzPainter/AzDrawingのファイル(*.apd)を読み込むプラグインのようです 0 10 2008年09月05日 投稿 NiVEサンプル ブレンド(除外)featuringマルチトーン エフェクト:ブレンド、マルチトーン 文字を1つずつ「除外」でブレンドすることで重なり部分に変化を起こす。 白黒(?)で作ってから、マルチトーンで着色しています 0 20 2008年10月11日 投稿 【NiVEサンプル】グリッドエフェクトを使った旗がなびくような表現例 エフェクト:グリッド、マルチタイリング、マルチスライド、回転 0 53 2008年11月28日 投稿 NiVEでパンヤのチャット文字消去 一応、理屈としては他のテロップ類も消せる・・・かも。 文字が滲んでるとかなり厳しそうですが 3 22 2008年10月13日 投稿 NiVEサンプル:なめらか移動(参照型) なめらか移動( sm3982573 )がさらにパワーアップww なめらか移動の解説 → sm3765118 エクスプレッションだった頃の解説 → sm3020415 1 05 2008年10月15日 投稿 【NiVE】球エフェクトを使ってみた【エフェクト】 エフェクト:球、球(イメージ) 内側からも見れるらしい 6 13 2008年11月21日 投稿 【NiVEサンプル】分割拡散(参照型)の紹介と解説 PluginAxにある「分割拡散」の高機能版である「分割拡散(参照型)」の解説です 非常に高機能ですが、使いこなすのは大変そうです。 かなり分かりやすい解説なので少しずつ使ってみるといいかもしれません 5 19 2008年11月30日 投稿 NiVE:エフェクトのサンプル 曲線1、曲線2、集中線、アルファ補正、投影2のサンプルです 0 10 2009年03月25日 投稿 NiVEサンプル 色ズレ エフェクト:加減算、ウィグラー(位置) 各色を少しずらして重ね合わせる感じ 1 12 2009年05月07日 投稿 NiVEサンプル:FreeTransform エフェクト:FreeTransform,マスク(基本図形) 自由変形を使って画像をねじる 0 48 2009年05月17日 投稿 NiVEサンプル:塗りつぶし エフェクト:塗りつぶし,塗りつぶし(境界色) こうしてみるとかなり便利なのがうかがえます 1 28 2009年05月23日 投稿 NiVE 用文字出力プラグイン「テキスト(GDI)」 これはすごい これがあればテキスト周りで不満を持つことはなくなるんじゃないかというぐらい 便利な機能が集められてます それでいて、タイムラインがすっきりしてるのがすごいところです 5 23 2009年05月31日 投稿 NiVE用の図形描画プラグイン作ってみた 塗りつぶし方や破線のパターンを指定できたり、端に矢印をつけたりできるので 色々な用途で使えそうです 1 00 2009年06月11日 投稿 【NiVEプラグイン】シンプルドローv2.1(メッシュ追加) sm7203635 にメッシュ機能が追加されたようです 8 36 2009年06月28日 投稿 【NiVEプラグイン】 WPFビットマップエフェクト 【エンボス・ベベル等】 映像にエンボス(浮き彫り)やベベル(縁加工)などの効果を与えるプラグインです。 ただし、.NET frameworkのバージョンが3.0以上でないと利用できないのでご注意 絵に使うのはもちろん、文字に使って質感を与えたりもできるようです 5 30 2009年07月24日 投稿 NiVEサンプル:半透明キー 普通のカラーキーではうまくいかないような素材の透過処理をうまく行えるようです 7 40 2009年08月20日 投稿 【NiVEプラグイン】WPFグラデーションの紹介【作ってみた】 グラデーションを作成するプラグインです なお、今回も.NET 3.0以上が必要だそうです
https://w.atwiki.jp/hp_sozai/
当サイトは、ハンゲームサークル『ホームページ作成の館』で企画された中で作成した素材サンプル集です。 大変申し訳有りませんが、サークルメンバー以外の方へのご観覧が出来ませんので予めご了承下さい
https://w.atwiki.jp/terragen/pages/82.html
Node Type Render ノード説明と目的 グローバル・イルミネーションを参照。 設定 Prepassタブ GI cache detail GIキャッシュ・ディティール GIキャッシュは、画像全体の多くのポイントの照明を記録します。これらは、レンダリング時にプレパスで見るドットの事です。各ドットは1つのサンプルに対応します。各サンプルには、さまざまな方向からの光を格納します。GIキャッシュ・ディティールは、プレパスを通した画像空間におけるサンプルの間隔に影響します。そして、最終パスでは、シーンの任意の部分である照明は、近接するサンプルの加重平均、言い換えるとフィルタリングされた補間となります。ディティールが低いほど近似値は粗くなります。ディティールが低すぎる場合、大抵はGIにおいてぼやけていたり明瞭さの欠いた表現となります。GIキャッシュ・ディティールが低いと、シーンの一部がプレパスで完全に見落とされる場合もあり、これらの領域にGI(暗くなる)が発生する可能性が結果として生じます。これは、画像内で小さくまばらな植物やオブジェクトで問題になる可能性がより高いです(GIキャッシュ・ディティールが高い場合も生じる可能性はありますが、極希です)。GIキャッシュ・ディティールはメモリ(およびGIキャッシュファイルに保存する場合はディスク)のGIキャッシュのサイズに影響を及ぼし、プリパスのレンダリングにかかる時間に影響します。最終パスのレンダリング時間にも影響する可能性がありますが、"GI sample quality"に比べるとはるかに低いです。レンダリング開始時にウインドウ内に広がる白い点々の集まりをプレパスと呼び、これらの点の一つ一つにその部分の明るさの情報が入っています。 GI sample quality GIサンプル・クオリティ GIキャッシュの各サンプルポイントでは、多くの光線がポイントの球形の外側に投射されて、そのポイントの照明を捕獲します。GIサンプル・クオリティは、各サンプルポイントから外側に投射される光線の数に影響します。実際の光線数は設定値(通常6x以上)よりはるかに大きいですが、一般的にGIサンプル・クオリティの設定が高いほど光線が多くなります。GIを受け入れる方向に関して多くのコントラストがある場合、"斑(まだら)"と評される事を避けるためや、時には重要な光源を見逃さないために、より高サンプルのディティールが必要となる事があります。デフォルト値の2は、一部の景観レンダリングには十分ですが、高品質の最終レンダリングではこれを増やしたい場合があります。また、建造物などのレンダリングでは少なくとも6を推奨します。GIサンプル・クオリティは、各サンプルに格納されるデータの量にも影響します。そのため、GIキャッシュ・ディティールとGIサンプル・クオリティの両方はメモリ内のGIのサイズとプレパスをレンダリングするのにかかる時間に影響します。主にプレパス時間に影響する時に、GIサンプル・クオリティは、GIキャッシュ・ディティールよりもはるかに多く、最終パスのレンダリング時間に影響します。 GI blur radius GIブラー半径 各GIサンプルのポイントは最終画像内の球形領域に影響を及ぼし、複数のサンプルの球形が重なり合っている所でそれらは一緒に平均化されます。これらの球形の半径は、レンダラーによって決定される様々なものに依存しますが、十分なサンプルが画像のすべての部分に重なる事を確保するための最小半径を強制的にコントロールします。GIブラー半径は画像空間におけるこの最小半径に影響します。これは画像空間にありますが、ピクセル単位ではありません。これは、プレパスで見るGIプレパスサンプルの間隔に比例しますが、 "Supersample prepass"で作成された余分のサンプルは含まれません。デフォルト値は8です。値を小さくするとGIにおいて素晴らしいディテールの印象を与えるかもしれませんが、画像中の斑やアニメーションのちらつきが増える可能性があります。値を大きくすると、GIが滑らかになりますが、外見上のディテールが減少する可能性があります。ほとんどのレンダリングでは8が適切な妥協点だと考えています。Terragen 3以降 半径がプレパスのサンプルの間隔に比例するため、"GI cache detail"を増やすと、画像空間のぼかし領域が減少します。このように動作するので、"GI cache detail"は補間のクオリティに影響を与えずに全体的なディティールを変化させます。Terragen 2 半径はプレパスのサンプルの間隔に比例しているため、レンダリング設定の"Detail"、"GI relative detail"を増や事で、画像空間のぼかし領域を減少します。このように動作するので、"Detail"と"GI relative detail"は補間のクオリティに影響を与えずに全体的なディティールを変化させます。 Supersample prepass スーパーサンプル・プレパス スーパーサンプル・プレパスは、近くに他のオブジェクトを持たない小さい(または綿密な)オブジェクトを見落とさないように、プレパス時により緻密にまとめたサンプルを取り入れます。プレパスでオブジェクトを見落としたり、近くに他のオブジェクトがない(フォアグラウンドの草の葉や細い樹木の幹など)場合は、これを有効にする必要があるかもしれません。プレパス時にオブジェクトを見落とすと、暗すぎる影(GIが重要な領域)を結果として生じる場合があります。ただし、スーパーサンプル・プレパスは(GIの全体的なクオリティを低下させる)各サンプルのクオリティを低下させるため、デフォルトではオフになっています。 GI Cache File(GIキャッシュファイル) No GI cache file GIキャッシュファイルの不要 画像を普通にレンダリングします。プレパスはGIを生成し、イメージパスは最終画像をレンダリングします。 Write to GI cache file GIキャッシュファイルを書込 GIキャッシュを生成するためにプレパスのみをレンダリングし、GIキャッシュをファイルに保存します。拡張子は".gic"。 Read GI cache file(s) GIキャッシュファイルを読込 最終画像のみをレンダリングします。GIは、(以前に生成された)GIキャッシュファイルから読み込まれます Blend mode ブレンドモード ・One file (exact filename) "Read GI cache file(s)"の右フィールドに指定したファイル名の1つのキャッシュファイルのみを読み込みます。これは正確なファイル名でも、ファイル名に "%04(引用符なし)"が含まれている場合、その文字列は現在のフレームを表す4桁のフレーム番号に置き換えられます。"4"は置き換えする番号の桁数を表し、桁数は変更可能です。ファイルが見つからない場合、レンダラーはエラーを報告します。シーケンスはこのモードでは検出されません。・Nearest file in sequence ベースファイル名("Read GI cache files"の設定ファイル名)から始まり、このモードではベースファイル名と同じシーケンスに属するファイルを検索します。レンダラーは、現在のフレーム番号に最も近いフレーム番号を持つファイルを選択して、1つのキャッシュファイルのみを読み取ります。シーケンス内の任意のファイルをベースファイル名として選択する事が出来ます。・Equal blend within range ベースファイル名("Read GI cache files"の設定ファイル名)から始まり、このモードではベースファイル名と同じシーケンスに属するファイルを検索します。レンダラーは、"Number of files to blend"パラメータと同じ数のファイルを読み込み、フレーム番号が現在のフレーム番号に最も近いファイルを選択しようとします。GIソリューションが3D空間で重なり合っている場合、結果は互いに平均化され、あるファイルのソリューションにギャップがある場合(カメラの視界外)は、他のファイルがデータを埋め込む事が出来ます。シーケンス内の任意のファイルをベースファイル名として選択する事が出来ます。・Interpolate (for animation) これは、現在のフレーム番号に応じてファイルの重量が異なり、アニメーションを通して安定したブレンドが生成される以外は、"Equal blend within range"と同類です。このモードは、キャッシュが 少ない 場合に便利です。 少ないキャッシュ の定義としては、すべてのフレームにキャッシュファイルがないGIキャッシュファイルのシーケンスを言います。例えば、フレーム10、20、30などにGIキャッシュファイルがあるとします。ブレンドモードを "Interpolate (for animation)"に設定すると、アニメーションの過程で選択されたGIキャッシュの異なるセット間で滑らかなブレンドが行われます。キャッシュファイル間のフレームが多くなるほど、ブレンドはより緩やかになります。重量の上昇/下降は、使用される最初と最後のファイルに適用され、異なるファイルセットの結果間で線形補間を行い、セットが変更されるフレーム間で破裂がわからないようにします(キャッシュファイルによる適用範囲が十分でない3D空間の場所でも破裂が発生する可能性があります)。ブレンドを有効にするには、"Number of files to blend"を2以上に設定する必要があります。このモードは、すべてのフレームにキャッシュファイルがある場合にも機能しますが、状況次第では補間アルゴリズムの性質上、1つ少ないキャッシュファイルをブレンドする点を除いて、"Equal blend within range"モードと同類です。 Number of files to blend ブレンドするファイル数 ブレンドモードが"Equal blend within range"、または"Interpolate (for animation)"の場合、フレームをレンダリングするために一緒に読み込んでブレンドするGIキャッシュファイルの最大数です。ブレンドモードが"Interpolate (for animation)"の場合、フレームによっては少数のファイルしか読み込まれません。これは、線形補間によって範囲内の最初または最後のファイルが重量がゼロである場合があるからです。GIキャッシュのブレンドには作業準備の付帯的コストとしてメモリ使用量が大きく取り上げられ、CPU使用率には劇的な影響はありません。5つ以上のGIキャッシュをブレンドすることは一般的に推奨されておらず、通常は3つで十分です。 Advanced(上級設定) GI prepass padding GIプレパス・パディング GIキャッシュファイルを使用しない場合(GIキャッシュファイルがこの問題を効果的に解決します)、隣接するクロップされたレンダリング、またはパノラマの継ぎ合わせ間の不均一な照明を避けるのに便利なプレパス中に計算された画像の領域をどれだけ拡大するかを指定します。0値はパディング不要を意味します。 Image Passタブ GI surface details GIサーフェスディテール この機能は、GIキャッシュのディテールの不足を補うように設計されています。Terragenのバージョンにより、仕様は異なります。これは、シェーディング時(画像のレンダリング中)やレンダリング中の最終イメージとバケット(タイル)上の後工程の組み合わせのいずれかで発生する別個の工程です。キャッシュはそのディティールを保存しません。あらかじめ生成されたキャッシュファイルからキャッシュを読み込んだり、単にレンダリングするたびにキャッシュを生成したりしても、GIサーフェスディテールは、シェーディングポイントから少し離れたところをレイトレースする事で、キャッシュ内のディティールを追加する事が出来ます。・Global Illumination 陰影とGIの跳ね返りを選択してディティールを追加します。・Ambient Occlusion アンビエント・オクルージョンの陰影にディティールを追加します。Terragen 3と4では、GIサーフェスディテールが影のディティールを強調し、画像空間に接近するサーフェス間で跳ね返る光を追加します。これは2つの工程で構成されていますが、どちらもGIキャッシュには存在しないディティールを追加するように設計されています。画像がレンダリングされている間、バケット(タイル)がレンダリングを仕上げるたびに、サブピクセルサンプルに後工程を適用して、サーフェスのきめ細かいディティールを捉えて際立たせます。次に、画像全体のレンダリングが終了すると、最終的なピクセルに別の後工程が適用され、サーフェスのより多くのディティールを捉えて際立たせます。反射がどのようにレンダリングされたかによって、間接光(GI)やいくつかのソフトリフレクションにのみ影響します。直接照明には影響しません。後処理は、最も一般的なレンダリング(例えばフルHDまで)に数秒、または非常に大きな画像(例えば10Kを超える)の場合には数分掛かる事があります。この間、ユーザーインターフェイスは応答しない可能性がありますが、処理が終了すると戻るため、むやみにクリックなどしないように注意して下さい。Terragen 2では、GIサーフェスディテールによって画像がレンダリングされている間にポイントがどのようにシェーディングされるかが変化していきます。これは、GIキャッシュにまだ存在しない陰影のディテールを、シェーディングポイントからの短い距離をトレースする事によって追加します。反射の仕方によっては間接光(GI)やソフトリフレクションにのみ影響します。直接照明には影響しません。この機能により、Terragen 2のレンダリング時間が大幅に短縮されます。 Occlusion weight オクルージョン効果 環境光が塞がれ光の届かないメッシュの交差部分や隙間などに疑似の陰影を付ける事でGIの陰影をシミュレートします。現実にはアンビエントオクルージョンのような影は出来ませんが、面の重なりなどによって出来る影を色濃く付ける事であたかも現実の影のように陰影を強調する事が出来ます。これは、GIの環境光が計算された後工程で処理されます。GI surface details=Global IlluminationGI surface details=Ambient Occlusion Bounce to the ounce 少量の跳ね返り 画像空間に接近するオブジェクトのサーフェス間で跳ね返る光を追加します。Ambient Occlusionは、この処理は行われません。 Radius(in pixels) 半径(ピクセル単位) 追加処理を行う際、光を取り込む半径を設定します。数値が低いと取り込む光は少なく、数値が高すぎると"Bounce to the ounce"の場合、跳ね返りの半径が大きすぎる事で逆にぼやけた結果になる事もあります。 Falloff フォールオフ ジオメトリのサーフェスで面の法線に対する"Radius"の距離によって、減衰する照明効果の有無を設定します。 GI in Cloudsタブ 以下の設定は、Terragen 4で新しく追加された『Cloud Layer V3』または『Easy Cloud』ノードのすべてのクラウドレイヤーのレンダリングに影響します。『Cloud Layer V2』ノードは、これらの設定の影響を受けません。例えば、『Cloud Layer V3』を使用している場合、内部のGI計算が『Cloud Layer V2』やその他の環境とは異なり、GIキャッシュファイルに格納されない事に注意が必要です。GIキャッシュはV3には効果がありますが、一部の照明は環境光から来るため、主要なGI分散は現時点ではキャッシュする事が出来ません。そのため、ちらつきを減らしたい場合はこのタブの"Cloud GI quality"の値を増やす必要があります。 Cloud GI quality 雲のGIクオリティ 『Cloud Layer V3』、『Easy Cloud』の背景/間接照明コンポーネントの精度に影響します。背景/間接照明コンポーネントは、太陽などの直射光を除いて、シーンの他の部分から受け取った光です。それは、地形や他の雲層(同じ雲層の一部ではない空の他のもの)のようなものから受け取った光を含みます。同じ雲層内での散乱は散乱は、別々に処理されるため含まれません。雲のGIは、雲の陰影部分で一番目立ちます。雲のGIクオリティは、この光がどれだけ正確に計算されるかに影響します。低クオリティの設定では、アニメーションでちらつきが発生したり、雲の中でシミだらけのような外観の照明を作り出す傾向にありますが、レンダリングは高速になります。ポップアップメニューの静止画(Still)、シーケンス(Sequence)の各段階は、光サンプル数を2倍にする事でクオリティ増加だけでなく、レンダリング時間の増加も示しています。 Cloud GI max ray depth 雲のGI最大レイ深度 Terragen 4.1以上からの対応です。"Cloud GI quality"と同様に、この設定は、『Cloud Layer V3』、『Easy Cloud』の背景/間接照明コンポーネントの精度に影響します。それは、シーンの他の部分からの光を含む最大レイ深度を制限します。これは、光が異なる雲層の間で跳ね返る(レイトレースの反射計算の)回数を意味します。回数が多いほど正確な画像に仕上がりますが、レンダリング時間も必要とします。1つの雲層内で光が何回散乱するかは、別々に処理されるので制限されません。シーン内の異なるノードによって作成された雲層間の跳ね返りにのみ影響します。シーンに多数の雲層がある場合、雲層間の光の相互作用に起因する長いレンダリング時間を防ぐために、この数値を低く(例えば1、2)抑える事が特に重要です。『Renderer』ノードのこの機能は、レンダリング時間を極端に増加させずにより高いレイ深度を可能にする将来の改善要項としています。 Voxel scattering quality ボクセル散乱クオリティ Terragen 4.1以上。これは、『Cloud Layer V2』を除く『Cloud Layer V3』、『Easy Cloud』のすべての雲層に影響します。雲を介して何度も散乱される光は、ボクセルバッファを通して多くの異なる散乱軌道をサンプリングする モンテカルロ法 を用いて計算されます。いくつかの雲を含むすべてのピクセルのために、多くの散乱軌道を計算し、一緒に平均化する事が出来ます。レンダリングエンジンとシェーダは、各画像サンプル(カメラからの光線)で計算される散乱軌道の数を決定しますが、ボクセルの散乱クオリティでこの量を増減する事が出来ます。この設定は乗数の役割を果たすため、100の場合、レンダラーは50の倍の軌道数を計算します。ほとんどの場合、デフォルト値50を使用する事を推奨します。ノイズの多いシーンは通常、より高いアンチエイリアス(雲だけでなく画像全体が改善されます)を使って滑らかに出来るので、ボクセルの散乱クオリティを50に据え置く事が出来ます。ただし、この値を増減して変更する事によって、一部のシーンのレンダリングを最適化出来る可能性があります。